package multiThread.threadPool;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.*;

/**
 * java 里面线程的顶级接口是Excutor，但严格意义上Excutor并不是一个线程池,而只是执行线程的工具，
 * 真正的线程池接口是ExcutorService
 * 4种线程池：
 * new CachedThreadPool 一个会根据需要创建新线程的线程池
 * new FixedThreadPool
 * new ScheduledThreadPool
 * new SingleThreadExecutor
 * 注：可以使用两个方法对线程池提交任务，分别是execute（提交不需要返回值的任务）和submit(需要返回值的任务)
 * 可以调用线程池的shutdown或shutdownNow来关闭线程池
 * 它们的原理是遍历线程池中的工作线程，然后逐个调用线程的interrupt方法来中断线程，所以无法响应中断的任务可能永远无法终止。
 */
public class Demo1 {

    private int taskSize = 5;

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Demo1 demo1 = new Demo1();
        demo1.createThread();
    }
    //创建一个线程池
    ExecutorService pool = Executors.newFixedThreadPool(taskSize);

    public void createThread() throws ExecutionException, InterruptedException {
        //创建多个有返回值的任务
        List<Future> list = new LinkedList<Future>();
        for(int i=0;i<taskSize;i++){
            Callable c = new MyCallable();
            //执行任务并获取future对象
            Future f = pool.submit(c);
            list.add(f);
        }

        //关闭线程池
        pool.shutdown();
        //获取所有并发任务的的运行结果
        for (Future f:list){
            System.out.println("res:"+f.get().toString());
        }
    }
}
